//
//  Class+Category.swift
//  Documentation
//
//  Created by Toj on 6/29/23.
//

// #MARK: - 问题?
1. 什么是Category?
2. Category 的作用是什么
3. Category 能声明属性吗? 能声明成员变量吗?
4. 分类什么时候被加载的?
5. Category 底层实现

#pragma mark - Category到底是什么
我们用clang把文件编译成.cpp文件,
编译器会把分类编译成结构体的形式

// 分类的本质
struct _category_t {
    const char *name;
    struct _class_t *cls;
    const struct _method_list_t *instance_methods;
    const struct _method_list_t *class_methods;
    const struct _protocol_list_t *protocols;
    const struct _prop_list_t *properties;
};

// #MARK: - Category有什么作用
1.1 不需要改变原类的基础上添加方法
1.2 分类只能添加方法不能添加属性,
即使定义了一个属性, 也只是个声明, 实质没有getter/ setter方法的实现

// #MARK: - Category 能声明属性吗? 能声明成员变量吗?
答: 能声明属性, 但是没有实现getter/ setter方法
但是不能声明属性,

// #MARK: 为什么不能声明属性?
答: 因为底层结构里没有ivarlist 表, 但是有prolist表,

// #MARK: 苹果为什么这么设计?
答: 因为Category 它是在运行期间决定的,  此时内存的分布已经确定, 把持着不改变原有类的内存分布的原则.
若此时再添加实例会改变内存的分布情况, 这对编译性语言是灾难, 是不允许的

// #MARK:  - 分类的底层实现
答: 详细请看【Category底层实现.h】
